
#include "linklist.h"				//声明单链表结点类型

void CreateListR(LinkNode *&L,ElemType a[],int n)
//尾插法建立单链表
{
	LinkNode *s,*r;
	L=(LinkNode *)malloc(sizeof(LinkNode));  	//创建头结点
	L->next=NULL;
	r=L;					//r始终指向终端结点,开始时指向头结点
	for (int i=0;i<n;i++)
	{
		s=(LinkNode *)malloc(sizeof(LinkNode));//创建新结点s
		s->data=a[i];
		r->next=s;			//将结点s插入结点r之后
		r=s;
	}
	r->next=NULL;			//终端结点next域置为NULL
}
void InitList(LinkNode *&L)
{
	L=(LinkNode *)malloc(sizeof(LinkNode));  	//创建头结点
	L->next=NULL;
}
void DestroyList(LinkNode *&L)
{
	LinkNode *pre=L,*p=pre->next;
	while (p!=NULL)
	{	free(pre);
		pre=p;
		p=pre->next;
	}
	free(pre);	//此时p为NULL,pre指向尾结点,释放它
}
bool ListEmpty(LinkNode *L)
{
	return(L->next==NULL);
}
int ListLength(LinkNode *L)
{
	LinkNode *p=L;int i=0;
	while (p->next!=NULL)
	{	i++;
		p=p->next;
	}
	return(i);
}
void DispList(LinkNode *L)
{
	LinkNode *p=L->next;
	while (p!=NULL)
	{	printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

void reverseL(LinkNode *&L)
 { 
// 在带头结点的单链线性表L进行反转  
	/********** Begin **********/ 
     if (L == nullptr || L->next == nullptr) {
        return; // 如果链表为空或只有一个节点，不需要反转
    }
    
    LinkNode *prev = nullptr; // 前一个节点初始化为nullptr
    LinkNode *curr = L->next; // 当前节点指向第一个实际节点
    LinkNode *next = nullptr; // 下一个节点初始化为nullptr
    
    while (curr != nullptr) {
        next = curr->next; // 保存当前节点的下一个节点
        curr->next = prev; // 反转当前节点的指针
        prev = curr; // 前一个节点移动到当前节点
        curr = next; // 当前节点移动到下一个节点
    }
    
    L->next = prev; // 头结点的next指向反转后的第一个节点
	/********** End **********/
}

